using System;
using System.Globalization;
using System.Windows.Data;
using WPFTemplateLib.WpfConverters.Core;

namespace WPFTemplateLib.WpfConverters
{
	/// <summary>
	/// [转换器] [DLGCY] 将某转换器转换出的 bool 结果转换为其他结果（一般只能以标记扩展方式使用）
	/// </summary>
	public class BoolResultConverterToOtherResultConverter : ValueConverterBase
	{
		/// <summary>
		/// 原先的值转换器（要求转换结果为 bool 值）
		/// </summary>
		public IValueConverter ValueConverter { get; set; }

		/// <summary>
		/// 结果获取模式（默认直接获取）
		/// </summary>
		public ResultGetMode ResultGetMode { get; set; } = ResultGetMode.Direct;

		/// <summary>
		/// ValueConverter 转换为 true 时的结果
		/// </summary>
		public object TrueResult { get; set; }

		/// <summary>
		/// ValueConverter 转换为 false 时的结果
		/// </summary>
		public object FalseResult { get; set; }

		/// <summary>
		/// 转换字符串结果的类型（默认 ConvertResultType.String）
		/// </summary>
		public ConvertResultType ConvertResultType { get; set; } = ConvertResultType.String;

		/// <summary>
		/// ValueConverter 转换为 true 时的结果（字符串形式）
		/// </summary>
		public string TrueResultStr { get; set; }

		/// <summary>
		/// ValueConverter 转换为 false 时的结果（字符串形式）
		/// </summary>
		public string FalseResultStr { get; set; }

		public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
		{
			string logPrefix = $"[{nameof(BoolResultConverterToOtherResultConverter)}]";
			try
			{
				if(ValueConverter == null)
				{
					Console.WriteLine($"{logPrefix} Error: ValueConverter is null.");
					return Binding.DoNothing;
				}

				object result = ValueConverter.Convert(value, typeof(bool), parameter, culture);
				if(result == null || result is not bool boolResult)
				{
					if(bool.TryParse(result + "", out bool convertedBoolResult))
					{
						boolResult = convertedBoolResult;
					}
					else
					{
						Console.WriteLine($"{logPrefix} Error: ValueConverter's result can not convert value to bool.");
						return Binding.DoNothing;
					}
				}

				if(boolResult)
				{
					if(ResultGetMode == ResultGetMode.Direct)
					{
						return TrueResult;
					}
					else if(ResultGetMode == ResultGetMode.ConvertFromString)
					{
						return ConverterHelper.ConvertValue(TrueResultStr, ConvertResultType);
					}
				}
				else
				{
					if(ResultGetMode == ResultGetMode.Direct)
					{
						return FalseResult;
					}
					else if(ResultGetMode == ResultGetMode.ConvertFromString)
					{
						return ConverterHelper.ConvertValue(FalseResultStr, ConvertResultType);
					}
				}

				//可能是扩增了 ResultGetMode，但是没有处理到
				return Binding.DoNothing;
			}
			catch(Exception ex)
			{
				Console.WriteLine($"{logPrefix} Exception: {ex}");
				return Binding.DoNothing;
			}
		}
	}
}
